题目描述
请实现一个函数用来判断字符串是否表示 数值 (包括整数和小数)。
数值 (按顺序)可以分成以下几个部分:
- 若干空格
- 一个 小数 或者 整数
- (可选)一个 $’e’$ 或 $’E’$ ,后面跟着一个 整数
- 若干空格
小数 (按顺序)可以分成以下几个部分:
- (可选)一个符号字符($’+’$ 或 $’-‘$)
- 下述格式之一:
- 至少一位数字,后面跟着一个点 $’.’$
- 至少一位数字,后面跟着一个点 $’.’$ ,后面再跟着至少一位数字
- 一个点 $’.’$ ,后面跟着至少一位数字
整数 (按顺序)可以分成以下几个部分:
- (可选)一个符号字符($’+’$ 或 $’-‘$)
- 至少一位数字
部分 数值 列举如下:
- $[“+100”, “5e2”, “-123”, “3.1416”, “-1E-16”, “0123”]$
部分 非数值 列举如下:
- $[“12e”, “1a3.14”, “1.2.3”, “+-5”, “12e+5.4”]$
示例 1:
1 | 输入:s = "0" |
示例 2:
1 | 输入:s = "e" |
示例 3:
1 | 输入:s = "." |
示例 4:
1 | 输入:s = " .1 " |
提示:
- $1 <= s.length <= 20$
- $s$ 仅含英文字母(大写和小写),数字($0-9$),加号 $’+’$ ,减号 $’-‘$ ,空格 $’ ‘$ 或者点 $’.’$ 。
算法
(模拟) $O(n)$
算法步骤:
- 先去除行首和行尾空格;
- 行首如果有一个正负号,直接忽略;
- 如果字符串为空或只有一个’.’,则不是一个合法数;
- 循环整个字符串,去掉以下几种情况:
(1) ‘.’或’e’多于1个;
(2) ‘.’在’e’后面出现;
(3) ‘e’后面或前面为空,或者’e’前面紧跟着’.’;
(4) ‘e’后面紧跟着正负号,但正负号后面为空; - 剩下的情况都合法;
时间复杂度
$O(n)$
空间复杂度
$O(1)$
C++ 代码
1 | class Solution { |